# @Time : 2020/7/29 14:56
# @Author : Fioman 
# @Phone : 13149920693
import cv2 as cv
import numpy as np

"""
Hu矩是归一化中心矩的线性组合.Hu矩在图像旋转,缩放,平移操作后,仍然能保持矩的不变性,所以经常会使用Hu矩来识别图像的特征.
在Opencv中,使用函数cv.HuMoments()可以得到Hu矩,该函数使用cv.momonts()函数的返回值作为参数,返回7个Hu矩值.
hu = cv.HuMoments(m)
式子中返回值hu,表示返回的Hu矩值;参数m,是由函数cv.moments()计算得到的矩特征值.

计算图像的Hu矩,对其中第0个矩的关系进行演示.
Hu矩是归一化中心矩的线性组合,每一个矩都是通过归一化中心矩的组合运算得到的.函数cv.moments()返回的归一化中心矩包含:
二阶Hu矩: nu20,nu11,nu02
三阶Hu矩: nu30,nu21,nu12,nu03
"""
img = cv.imread("moments.jpg", cv.IMREAD_COLOR)
gray = cv.cvtColor(img, cv.COLOR_BGR2GRAY)

huM1 = cv.HuMoments(cv.moments(gray))
print("huM1 = {},type(huM1) = {}".format(huM1, type(huM1)))
huM1 = huM1.flatten()
print("huM1 = {},type(huM1) = {}".format(huM1, type(huM1)))
print("\ncv.moments(gray)['nu20'] + cv.moments(gray)['nu02'] = {} + {} = {}\n".format(
    cv.moments(gray)['nu20'], cv.moments(gray)['nu02'], cv.moments(gray)['nu20'] + cv.moments(gray)['nu02']))

print("HuM1[0] = {}".format(huM1[0]))
print("\nHu[0] - (nu02+nu20) = {}".format(huM1[0] - (cv.moments(gray)['nu20'] + cv.moments(gray)['nu02'])))
